'''
寻找回文单词，思路

1.创建一个字典序列文件，里面存放有单词
2.打开这个文件，并将里面的每个单词分割出来，存放近一个序列并返回
3.创建一个空序列以存放回文
4.遍历返回的这个序列
    反向切割比较是否是回文
    如果是存放进新建的空序列
    打印回文

延伸：
    #1：反向切片，例：
        word = she
        word[:] 正向切片
        输出 'she'
        word[::-1] 反向切片
        输出 'ehs'

    #2：分拆操作符：
        同遍历取值方法同等，将列表中的每个元素分拆成函数的位置参数
        用法
            在对象前加 '*'
'''
import  sys,cProfile

def openFile(file):
    try:
        #保证代码块无论以怎样的方式结束都会自动关闭
        with open(file) as in_file:
            loadText = in_file.read().strip().split('\n') #读取文件内容，删除空格，并以'\n'分割
            loadText = [x.lower() for x in loadText] #列表推导:将一种列表或者可迭代对象转换成另一个列表的快速方法
            return loadText
    except IOError as e:
        print('文件{}打开发生{}错误'.format(file,e))
        sys.exit(1)

'''
寻找回文短语，思路：
    1.创建一个字典序列文件，里面存放有单词
    2.打开这个文件，并将里面的每个单词分割出来，存放近一个序列并返回
    3.创建一个空序列以存放回文
    4.遍历列表中的每一个单词
        获取单词长度
        进行反向切片比较每一个字母
        如果前面的字母和末尾的字母组成倒序，并且剩余的字母形成回文序列，将结果添加进列表中
        如果末尾的字母和前面的字母组成倒序，并且剩余的字母形成回文序列，将结果添加进列表中
'''


if __name__ == '__main__':
    WordList = openFile('2of4brif.txt')

    pali_list = [] #存放回文短句

    PaliList = [] #存放回文单词

    for word in WordList:
        if len(word)>1 and word == word[::-1]: #1.反向切片
            PaliList.append(word)
    print('一共发现{}个回文单词'.format(len(PaliList)),file=sys.stderr)
    print(*PaliList,sep='\n') #2.分拆操作符

    for Word in WordList:
        end = len(Word)
        rev_word = Word[::1]
        if end>1:
            for i in range(end):
                if Word[i:] == rev_word[:end-i] and rev_word[end-i:] in WordList:
                    pali_list.append((Word,rev_word[end-i:]))
                if Word[:i] == rev_word[end-i:] and rev_word[:end-i] in WordList:
                    pali_list.append((rev_word[:end-i],Word))

    pali_sorted = sorted(pali_list)#根据短语的第一个单词，对短语进行排序

    print('一共发现{}个回文短句'.format(len(pali_sorted)),file=sys.stderr)
    for first,second in pali_sorted:
        print('{} {}'.format(first,second))